"""主键相关的衍生配置处理"""

from typing import Dict, Any
from src.base import bera

def derive_primarykey_config(meta_info: Dict[str, Any]) -> Dict[str, Any]:
    """处理主键相关的衍生配置

    根据 table.sql.primarykeys 信息生成衍生配置:
    - table.derived.primarykeys.count: 主键数量（一般为1）
    - table.derived.primarykeys.pk1: 第一个主键字段的完整衍生信息
    - table.derived.primarykeys.pk2: 第二个主键字段的完整衍生信息
    - table.derived.primarykeys.list: 所有主键字段信息（暂时设为{}，预留扩展）

    Args:
        meta_info: meta.json格式的结构体

    Returns:
        Dict[str, Any]: 更新后的结构体
    """
    bera.logger.debug("====== 开始处理主键衍生配置 ======")

    # 确保table和derived存在
    if "table" not in meta_info:
        meta_info["table"] = {}
    if "derived" not in meta_info["table"]:
        meta_info["table"]["derived"] = {}

    # 初始化primarykeys配置
    meta_info["table"]["derived"]["primarykeys"] = {
        "count": 0,
        "pk1": {},   # 第一个主键字段
        "pk2": {},   # 第二个主键字段
        "list": {}   # 暂时不实现，预留扩展
    }

    # 获取主键信息
    primarykeys_info = meta_info.get("table", {}).get("sql", {}).get("primarykeys", {})

    if not primarykeys_info or not primarykeys_info.get("fields"):
        bera.logger.debug("未找到主键信息，使用默认配置")
        return meta_info

    # 设置主键数量
    pk_fields = primarykeys_info.get("fields", [])
    pk_count = len(pk_fields)
    meta_info["table"]["derived"]["primarykeys"]["count"] = pk_count

    bera.logger.debug(f"发现 {pk_count} 个主键字段")

    def _derive_pk_info(pk_field: Dict[str, Any], pk_key: str, pk_index: int) -> None:
        """衍生单个主键字段的配置信息

        Args:
            pk_field: 主键字段信息（来自 primarykeys.fields）
            pk_key: 存储键名（pk1, pk2）
            pk_index: 主键索引（用于日志显示）
        """
        pk_name = pk_field.get("name")
        bera.logger.debug(f"第{pk_index}个主键字段: {pk_name}")

        # 从columns中查找对应的字段详细信息
        if pk_name and pk_name in meta_info.get("columns", {}):
            pk_column = meta_info["columns"][pk_name]

            # 冗余存储主键的完整信息
            meta_info["table"]["derived"]["primarykeys"][pk_key] = {
                # 基本信息（来自 primarykeys.fields）
                "name": pk_name,
                "sql_type": pk_field.get("type", ""),
                "auto_increment": pk_field.get("auto_increment", False),
                "nullable": pk_field.get("nullable", False),
                "order": pk_field.get("order", pk_index),

                # 通用信息（来自 columns.*.common）
                "description": pk_column.get("common", {}).get("description", ""),
                "label": pk_column.get("common", {}).get("label", ""),
                "required": pk_column.get("common", {}).get("required", False),

                # SQL 详细信息（来自 columns.*.sql）
                "sql": pk_column.get("sql", {}),

                # 命名相关的衍生信息
                "naming": pk_column.get("naming", {}),

                # 各种技术栈的衍生信息
                "java": pk_column.get("derived", {}).get("java", {}),
                "ts": pk_column.get("derived", {}).get("ts", {}),
                "ui": pk_column.get("derived", {}).get("ui", {}),

                # SpringBoot 配置（如果存在）
                "springboot": pk_column.get("springboot", {}),

                # 其他配置
                "mark": pk_column.get("mark", {}),
            }

            bera.logger.debug(f"成功设置第{pk_index}个主键的衍生信息: {pk_name}")
        else:
            bera.logger.warning(f"未找到主键字段 {pk_name} 的详细信息")

    # 处理主键字段（最多支持2个）
    if pk_count > 0:
        _derive_pk_info(pk_fields[0], "pk1", 1)

    if pk_count > 1:
        _derive_pk_info(pk_fields[1], "pk2", 2)

    bera.logger.debug("====== 主键衍生配置处理完成 ======")
    return meta_info